package com.lhh.springcommon.utils;


import com.aliyun.tea.TeaException;
import lombok.extern.slf4j.Slf4j;

import java.util.Random;

/**
 * 阿里云短信服务
 * @author 李厚航
 */
@Slf4j
public class SendSms {

    /**
     * 使用AK&SK初始化账号Client
     * @return Client
     */
    private static com.aliyun.dysmsapi20170525.Client createClient(String accessKey,String secretKey) throws Exception {
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                // 必填，您的 AccessKey ID
                .setAccessKeyId(accessKey)
                // 必填，您的 AccessKey Secret
                .setAccessKeySecret(secretKey);
        // Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
        config.endpoint = "dysmsapi.aliyuncs.com";
        return new com.aliyun.dysmsapi20170525.Client(config);
    }

    /**
     * 生成随机6位验证码
     * @return 验证码
     */
    private static String createCode(int maxNumber){
        StringBuilder code = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < maxNumber; i++) {
            int r = random.nextInt(10);
            code.append(r);
        }
        return code.toString();
    }

    /**
     * 请求阿里云短信服务生成验证码
     * @param phoneNumber 手机号
     * @return 验证码
     */
    public static String createSendSms(String phoneNumber,int maxNumber,String accessKey,String secretKey) throws Exception {
        String code = createCode(maxNumber);
        // 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
        // 工程代码泄露可能会导致 AccessKey 泄露，并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用，仅供参考，建议使用更安全的 STS 方式，更多鉴权访问方式请参见：https://help.aliyun.com/document_detail/378657.html
        com.aliyun.dysmsapi20170525.Client client = SendSms.createClient(accessKey,secretKey);
        com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
                .setSignName("阿里云短信测试")
                .setTemplateCode("SMS_154950909")
                .setPhoneNumbers(phoneNumber)
                .setTemplateParam("{\"code\":\"" + code + "\"}")
                .setSmsUpExtendCode("")
                .setOutId("");
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            // 复制代码运行请自行打印 API 的返回值
            client.sendSmsWithOptions(sendSmsRequest, runtime);
            log.info("手机号:{},验证码:{}",phoneNumber,code);
        } catch (TeaException error) {
            // 错误 message
            log.error("手机号:{},错误信息:{}",phoneNumber,error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception errorException) {
            TeaException error = new TeaException(errorException.getMessage(), errorException);
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
        return code;
    }
}
